package com.team.game.Game;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PathMeasure;
import android.graphics.PointF;
import android.graphics.RectF;

import com.team.game.Game.Sprites.Sprite;
import com.team.game.framework.Abstract.Waves;

import java.util.ArrayList;

public class Wave implements Waves {
    public ArrayList<Sprite> Sprites; //масив для зберігання мобів
    public int Num_Mob_Wave; //кількість мобів в хвилі
    public int Mob_Wave;  //номер моба , який повертається методом WaveSearchMob
    public float distance = 0;
    public float distance1 = 0;
    public PointF point = new PointF (); //точка повертається методом WaveSearchMob


    public Wave(int Num_Mob, int[] Num_Mob_Kind, float[] Mob_Time, int[] Num_Path, PathMeasure[] pathMeasure) {
        Num_Mob_Wave = Num_Mob; // записуємо кількість мобів в хвилі
        Sprites = new ArrayList<>(Num_Mob_Wave);  //створюємо масив, мобів
        for (int i = 0; i < Num_Mob; i++) { // створюємо мобів
            Sprites.add(i, new Sprite(pathMeasure[Num_Path[i]], Mob_Time[i], Num_Mob_Kind[i]));
        }
    }

    @Override
    public void WaveUpdate() {
        for (int i = 0; i < Num_Mob_Wave; i++)
            Sprites.get(i).updateSprite(); //оновлюємо кожного моба
    }


    //-----------test-----------------
    Paint paint = new Paint ();
    boolean bool = false;
    //-----------test-----------------

    @Override
    public void WaveDraw(Canvas canvas) {



        for (int i = Num_Mob_Wave - 1; i >= 0; i--)
            Sprites.get(i).drawSprite(canvas);
    }

    @Override
    public void WaveDispose() {
        Sprites.clear();
    }


    @Override
    public void WaveRestart() {
        for (int i = 0; i < Num_Mob_Wave; i++) {  //піднімаємо хвилю мобів(доки ніде не використовується)
            Sprites.get(i).spriteReboot(true);
        }
    }

//    float x, y;
//
//    @Override
//    public void impactOnTheRadius(PointF pointF, float Damage, float Radius) {
//        x = pointF.x;
//        y = pointF.y;
//        for (int i = 0; i < Num_Mob_Wave; i++) {
//            if (!Sprites.get(i).deadSearch) //перевірка: чи не було вбито моба
//            {
//                distance = (float) (Math.sqrt(Math.pow((Sprites.get(i).getRect().centerX() - x), 2.0) +
//                        Math.pow(Sprites.get(i).getRect().centerY() - y, 2.0)));//знаходимо відстань
//                if (distance < Radius) {
//                    Sprites.get(i).dec(Damage);
//                }
//            }
//        }
//    }

//    public PointF points[] = new PointF[4];
//    @Override
//    public void impactOnDegRect (RectF posOfBmp, float alpha, PointF pnt, float damage) {
//
//        alpha = (float) Math.toRadians (alpha);
//
//        for (int i = 0; i < Num_Mob_Wave; i++) {
//            if (!Sprites.get (i).deadSearch) //перевірка: чи не було вбито моба
//            {
//                bool = true;
//
//                points[0] = new PointF (posOfBmp.left, posOfBmp.top);
//                points[1] = new PointF (posOfBmp.right, posOfBmp.top);
//                points[2] = new PointF (posOfBmp.left, posOfBmp.bottom);
//                points[3] = new PointF (posOfBmp.right, posOfBmp.bottom);
//
//                for (int j = 0; j < 4; j++) {
//
//                    points[j].x = (float) ((points[j].x - pnt.x) * Math.cos (alpha) - (points[j].y - pnt.y) * Math.sin (alpha) + pnt.x);
//                    points[j].y = (float) ((points[j].x - pnt.x) * Math.sin (alpha) + (points[j].y - pnt.y) * Math.cos (alpha) + pnt.y);
//
//                }
//
//                PointF point = new PointF (Sprites.get (i).getRect ().centerX (), Sprites.get (i).getRect ().centerY ());
//
//                float a = (points[0].x - point.x) * (points[1].y - points[0].y) - (points[1].x - points[0].x) * (points[0].y - point.y);
//                float b = (points[1].x - point.x) * (points[2].y - points[1].y) - (points[2].x - points[1].x) * (points[1].y - point.y);
//                float c = (points[2].x - point.x) * (points[0].y - points[2].y) - (points[0].x - points[2].x) * (points[2].y - point.y);
//
//                float d = (points[3].x - point.x) * (points[1].y - points[3].y) - (points[1].x - points[3].x) * (points[3].y - point.y);
//                float e = (points[2].x - point.x) * (points[3].y - points[2].y) - (points[3].x - points[2].x) * (points[2].y - point.y);
//
//
//                if (((a >= 0 && b >= 0 && c >= 0) || (d >= 0 && e >= 0 && b >= 0)) ||
//                        ((a <= 0 && b <= 0 && c <= 0) || (d <= 0 && e <= 0 && b <= 0))) {
//                    Log.i ("RAY", "kick to : " + point.toString ());
//                    Sprites.get (i).dec (damage);
//                }
//            }
//        }
//    }

    @Override
    public RectF waveGetPosition(int mob) {
        return Sprites.get(mob).getRect();// повертаємо позицію моба
    }

    @Override
    public void mobStrike(int mob, float kick) {
        Sprites.get(mob).dec(kick); // наносимо, урон заданому мобу
    }


    @Override
    public PointF WaveSearchMob(float x, float y, float init, float radius1) {
        Mob_Wave = -1;  //-1 свідчить що в хвилі не було моба
        distance1 = init;

        for (int i = 0; i < Num_Mob_Wave; i++) {
            if (!Sprites.get(i).deadSearch) //перевірка: чи не було вбито моба
            {
                distance = (float) (Math.sqrt(Math.pow((Sprites.get(i).getRect().centerX() - x), 2.0) +
                        Math.pow(Sprites.get(i).getRect().centerY() - y, 2.0)));//знаходимо відстань
                if (distance <= distance1 && distance > radius1) //перевірка на входження моба в діапазон
                {
                    distance1 = distance; // якщо знайдено найближчого моба - переписуємо параметры
                    Mob_Wave = i;
                }
            }
        }
        if (Mob_Wave == -1) {// якщо не було знайдено моба
            point.set(-1, distance1);
            return point;
        } else {
            point.set(Mob_Wave, distance1);
            return point;
        }
    }

    public void Mob_Reboot(int Num_mob, boolean resuraction) {
        Sprites.get(Num_mob).spriteReboot(resuraction); // відновлення конкретного моба
    }

}
